iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
自我挑戰組

30天建構出一個簡單 LineBot 機器人系列 第 16

DAY 16 Django資料庫使用(下篇)

  • 分享至 

  • xImage
  •  

新增完四個學生資料後,今天和大家介紹如何設定Admin管理介面中的資料顯示方式(篩選、搜尋、排序)以及資料庫的新增、修改和刪除。

顯示多欄位資料

若想要顯示多個欄位則必須定義ModelAdmin類別,以list_display定義顯示的資料欄位。
id為系統自動產生的欄位,它的值每次會遞增1。

<admin.py>

class studentAdmin(admin.ModelAdmin):
    list_display=('id','cName','cSex','cBirthday','cEmail','cPhone','cAddr')

admin.site.register(student,studentAdmin)

呈現結果:

上述為選取顯示欄位,接下來介紹如何篩選、搜尋、排序:

  • 使用list_filter資料篩選
  • #使用search_fields依照欄位搜尋
  • #使用ordering排序,加負號(-)為遞減排序

<admin.py>

class studentAdmin(admin.ModelAdmin):
    list_display=('id','cName','cSex','cBirthday','cEmail','cPhone','cAddr')
    list_filter=('cName','cSex')
    search_fields=('cName',)
    ordering=('id',)

呈現結果:

資料庫查詢

使用models模組中的objects.get()和使用models模組中的objects.all()方法可以讀取資料。

取得一筆資料

objects.get()方法可取得一筆資料,查詢成功將回傳一筆資料,若回傳多筆或資料不存在會產生錯誤,所以通常以try/expect檢視是否有誤。

基本語法:

資料表.objects.get(查詢條件)

這裡以「cName="李曉玫"」進行查詢練習,於templates資料夾中新增<listone.html>設定顯示的網頁模板。

<view.py>

from test4api.models import student

def listone(request): 
    try: 
        unit = student.objects.get(cName="李曉玫") #讀取一筆資料
    except:
        errormessage = " (讀取錯誤!)"
    return render(request, "listone.html", locals())

<listone.html>

<!DOCTYPE html>
<html>
 <head>
  <title>顯示一筆資料</title>
 </head>
 <body>
  <h2>顯示 student 資料表一筆資料{{errormessage}}</h2>
        編號:{{ unit.id }} <br />
        姓名:{{ unit.cName }}  <br />
        性別:{{ unit.cSex }}  <br />
        生日:{{ unit.cBirthday}}  <br />
        郵件帳號:{{unit.cEmail }}  <br />
        電話:{{ unit.cPhone }}  <br />
        地址:{{ unit.cAddr}}  <br />
 </body>
</html>
  • {{errormessage}}為顯示錯誤訊息
  • {{ unit.id }} 為顯示自動編號id欄位

取得所有資料

objects.all()方法可取得所有資料,也可以將資料「order_by("欄位名稱")」依指定欄位進行資料排序,若加上負號(-)為遞減排序。

基本語法:

資料表.objects.get()

這裡以「order_by('id')」進行查詢與排序練習,跟上述一樣須新增<listall.html>設定顯示的網頁模板。

<view.py>

def listall(request):  
    students = student.objects.all().order_by('id')  
    return render(request, "listall.html", locals())

<listall.html>

<!DOCTYPE html>
<html>
 <head>
  <title>顯示所有資料</title>
 </head>
 <body>
  <h2>顯示 student 資料表所有資料</h2>
  <table border="1" cellpadding="0" cellspacing="0">
   <th>編號</th><th>姓名</th><th>性別</th><th>生日</th>
   <th>郵件帳號</th><th>電話</th><th>地址</th>
   {% for student in students %}
    <tr>
     <td>{{ student.id }} </td>
     <td>{{ student.cName }} </td>
     <td>{{ student.cSex}} </td>
     <td>{{ student.cBirthday }} </td>
     <td>{{ student.cEmail }} </td>
     <td>{{ student.cPhone}} </td>
     <td>{{ student.cAddr }} </td> 
    </tr>
   {% endfor %}
  </table>
 </body>
</html>
  • 以{% for student in students %}的迴圈方式逐一取得students串列資料


新增資料

首先在<urls.py>中加入資料管理的連結

<urls.py>

urlpatterns = [
    ......
    re_path(r'^insert/$', views.insert),   #新增資料
    re_path(r'^modify/$', views.modify),   #修改資料
    re_path(r'^delete/$', views.delete),   #刪除資料
]

objects.create()方法可新增資料,基本語法:

紀錄變數 = 資料表.objects.create(欄位1=值1,...)

這邊練習將紀錄變數設為unit,日期格式需為「yyyy-mm-dd」,並以id欄位遞減

<view.py>

def insert(request):  #新增資料
    cName = '林三和'
    cSex =  'M'
    cBirthday =  '1987-12-26'
    cEmail = 'miwamail@gmail.com'
    cPhone =  '0963245612'
    cAddr =  '新北市蘆洲區中正路243巷19號'
    unit = student.objects.create(cName=cName, cSex=cSex, cBirthday=cBirthday, cEmail=cEmail,cPhone=cPhone, cAddr=cAddr) 
    unit.save()  #寫入資料庫
    students = student.objects.all().order_by('-id')  
    return render(request, "listall.html", locals())

修改資料

修改資料須先取得要修改的資料,「條件」格式通常「欄位名稱=值」
基本語法:

紀錄變數 = 資料表.objects.get(條件)

練習為修改cBirthday、cAddr的資料

練習程式

def modify(request):  #修改資料
    unit = student.objects.get(cName='林三和')
    unit.cBirthday =  '1987-12-11'
    unit.cAddr = '新北市蘆洲區中正路185巷63號'
    unit.save()  #寫入資料庫
    students = student.objects.all().order_by('-id')
    return render(request, "listall.html", locals())

刪除資料

刪除資料與修改資料相同須先取得要刪除的資料,再使用delete方法刪除資料
基本語法:

紀錄變數 = delete()

練習為修改cBirthday、cAddr的資料

練習程式

def delete(request,id=None):  #刪除資料
    unit = student.objects.get(id=5)
    unit.delete()
    students = student.objects.all().order_by('-id')
    return render(request, "listall.html", locals())

Django資料庫介紹到個段落啦,接下來和大家分享更進階的內容~


上一篇
DAY 15 Django資料庫使用(上篇)
下一篇
DAY 17 Line 訊息的介紹
系列文
30天建構出一個簡單 LineBot 機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言